perm filename SMOOTH.SAI[PIC,HE] blob
sn#430345 filedate 1979-04-04 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00004 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 ENTRY smooth
C00005 00003 IF BYTZ=1 THEN BEGIN "BYTESIZE = 1"
C00007 00004 ELSE BEGIN "BYTESIZE ≠ 1"
C00010 ENDMK
C⊗;
ENTRY smooth;
BEGIN "smoothH"
REQUIRE "BAYSAI.SAI" SOURCE!FILE;
SOURCE!V(PICBUF.DCL);
SOURCE!L(UTILS.DCL);
REQUIRE "36A" COMPILER!SWITCHES;
SIMPLE INTERNAL INTEGER PROCEDURE smooth(INTEGER IBUFF,winI,winJ; Real fract; integer diver);
BEGIN "smooth"
SIMPLE INTEGER PROCEDURE CEILING(REAL VAL);
BEGIN
INTEGER IVAL;
RETURN(IF (IVAL←VAL)=VAL THEN IVAL ELSE IVAL+1);
END;
INTEGER WMINI,WPLSI,WMINJ,WPLSJ,IMIN,JMIN,IMAX,JMAX,ROW,COL,OBUFF,I,II,
J,JJ,SUM,PTRO,PTRI,PTRTL,PTRTR,PTRBL,PTRBR,JLO,BBUFF,BPTR,BYTZ,
SUMI,FACT;
simple procedure smcol(integer i,js,je,val);
begin
integer j,opt;
opt←outptr(i,js,obuff);
for j←js thru je do
idpb(val,opt);
end;
simple procedure smrow(integer ist,ie,ival);
begin
integer i,j,ipt,opt;
for i←ist thru ie do
begin
ipt←inptr(ival,1,obuff);
opt←outptr(i,1,obuff);
for j←1 thru col do
idpb(ildb(ipt),opt)
end;
end;
WMINI←(winI-1)/2;
WPLSI←winI/2;
WMINJ←(winJ-1)/2;
WPLSJ←winJ/2;
FACT←WINI*WINJ;
IF DIVER THEN
BEGIN
FOR BYTZ←1 THRU FACT DO
IF (2↑BYTZ)≥FACT THEN DONE;
FACT←1;
END
ELSE BYTZ←BYTSZ(IBUFF);
IMIN←WMINI+1; IMAX←(ROW←ROWS(IBUFF))-WPLSI;
JMIN←WMINJ+1; JMAX←(COL←COLMS(IBUFF))-WPLSJ;
PAGMIN((wini+5) MAX 10);
GETBUF(ROW,COL,BYTZ,OBUFF←FNDBUF(0));
PUTSUB(ISUBST(IBUFF),JSUBST(IBUFF),OBUFF);
IF NOT DIVER THEN COPY(IBUFF,OBUFF);
GETBUF(1,COL,36,BBUFF←FNDBUF(-1));
PTRO←OUTPTR(IMIN,JMIN,OBUFF);
BPTR←OUTPTR(1,JMIN,BBUFF);
IF BYTZ=1 THEN BEGIN "BYTESIZE = 1"
INTEGER CRITVAL;
CRITVAL←CEILING((1-FRACT)*FACT);
FOR J←JMIN THRU JMAX DO
BEGIN "JL"
JLO←J-WMINJ;
SUM←0;
FOR II←1 THRU winI DO
BEGIN "IIL"
PTRI←INPTR(II,JLO,IBUFF);
FOR JJ←1 THRU winJ DO
SUM←SUM+ILDB(PTRI);
END "IIL";
IDPB(SUM≥CRITVAL,PTRO);
IDPB(SUM,BPTR);
END;
! WELL THATS THE END OF THE FIRST ROW NOW FOR THE FAST PART;
! THE FIRST COL IS DIFFERENT AND THE REST ARE FASTER;
FOR I←IMIN+1 THRU IMAX DO
BEGIN "IL"
PTRO←OUTPTR(I,JMIN,OBUFF);
BPTR←INPTR(1,JMIN,BBUFF);
PTRTL←PTRTR←INPTR(I-WMINI-1,1,IBUFF);
PTRBL←PTRBR←INPTR(I+WPLSI,1,IBUFF);
SUM←0;
FOR JJ←1 THRU winJ DO
SUM←SUM+ILDB(PTRBR)-ILDB(PTRTR);
SUMi←SUM+ILDB(BPTR);
IDPB(SUMI≥CRITVAL,PTRO);
DPB(SUMi,BPTR);
FOR J←JMIN+1 THRU JMAX DO
BEGIN "JLL"
SUM←SUM-ILDB(PTRBL)+ILDB(PTRBR)+ILDB(PTRTL)-ILDB(PTRTR);
SUMi←SUM+ILDB(BPTR);
IDPB(SUMI≥CRITVAL,PTRO);
DPB(SUMi,BPTR);
END "JLL";
rowchk(CHKROW,rows,i,CHKROW);
END "IL";
END "BYTESIZE = 1"
ELSE BEGIN "BYTESIZE ≠ 1"
INTEGER ROUND;
ROUND←FRACT*FACT;
FOR J←JMIN THRU JMAX DO
BEGIN "JL"
JLO←J-WMINJ;
SUM←ROUND;
FOR II←1 THRU winI DO
BEGIN "IIL"
PTRI←INPTR(II,JLO,IBUFF);
FOR JJ←1 THRU winJ DO
SUM←SUM+ILDB(PTRI);
END "IIL";
IDPB(SUM DIV FACT,PTRO);
IDPB(SUM,BPTR);
END;
! WELL THATS THE END OF THE FIRST ROW NOW FOR THE FAST PART;
! THE FIRST COL IS DIFFERENT AND THE REST ARE FASTER;
! now for the smearing the boundaries;
if diver
then begin
smcol(imin,1,jmin-1,getpnt(imin,jmin,obuff));
smcol(imin,jmax+1,col,getpnt(imin,jmax,obuff));
smrow(1,imin-1,imin);
end;
FOR I←IMIN+1 THRU IMAX DO
BEGIN "IL"
PTRO←OUTPTR(I,JMIN,OBUFF);
BPTR←INPTR(1,JMIN,BBUFF);
PTRTL←PTRTR←INPTR(I-WMINI-1,1,IBUFF);
PTRBL←PTRBR←INPTR(I+WPLSI,1,IBUFF);
SUM←0;
FOR JJ←1 THRU winJ DO
SUM←SUM+ILDB(PTRBR)-ILDB(PTRTR);
SUMI←SUM+ILDB(BPTR);
IDPB(SUMI DIV FACT,PTRO);
if diver then smcol(i,1,jmin-1,sumi); ! smear col;
DPB(SUMi,BPTR);
FOR J←JMIN+1 THRU JMAX DO
BEGIN "JLL"
SUM←SUM-ILDB(PTRBL)+ILDB(PTRBR)+ILDB(PTRTL)-ILDB(PTRTR);
SUMI←SUM+ILDB(BPTR);
IDPB(SUMI DIV FACT,PTRO);
DPB(SUMi,BPTR);
END "JLL";
if diver then smcol(i,jmax+1,col,sumi);
rowchk(CHKROW,rows,i,CHKROW);
END "IL";
if diver then smrow(imax+1,row,imax);
END "BYTESIZE ≠ 1";
! THATS IT;
frebuf(bbuff);
RETURN(OBUFF);
END "smooth";
END "smoothH";